package main

import (
	"fmt"
)

// 要求一：能够实现删除操作就可以。
// 要求二：考虑使用比较高性能的实现。
// 要求三：改造为泛型方法
// 要求四：支持缩容，并旦设计缩容机制。
func delete[T any](sli []T, idx uint) []T {
	// 参数边界校验
	if len(sli) == 0 {
		panic("切片参数不能为空切片")
	}
	len := len(sli)
	if int(idx) > len-1 {
		panic("不合法的idx索引参数")
	}
	cap := cap(sli)
	/*判定是否需要缩容
	实际元素数量缩小到小于等于底层数组容量的两倍时触发
	*/
	if 2*len <= cap && len > 2 {
		newSli := make([]T, (cap/2)-1)
		copy(newSli, sli[idx:])
		copy(newSli[idx:], sli[idx+1:])
		fmt.Println("命中缩容")
		return newSli
	}
	// 最好情况下：删除元素为最后一个
	if idx == uint(len-1) {
		fmt.Println("命中最好情况")
		return sli[:len-1]
	}
	// 删除索引位置的元素
	//_ = append(sli[:idx], sli[idx+1:]...) //方案1
	copy(sli[idx:], sli[idx+1:]) // 方案2
	fmt.Println("命中平常情况")
	return sli[:len-1]
}

func main() {
	sli1 := []int{1, 2, 3, 4, 5, 6, 7, 8}
	newSli := sli1
	for i := 0; i < len(sli1); i++ {
		newSli = delete(newSli, 0)
		fmt.Printf("%v, cap: %d\n", newSli, cap(newSli))
	}
}
